//////////////////////////////////////////////////////////////////////////////////////////////////////
// 项目名   : Container
// 文件名   : UnorderedContainer.h
// 作者     : Aiye
// 日期     : 2025/9/7 16:15
// 邮箱     : 2878548868@qq.com
// 摘要     : 介绍无序关联容器
//////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef CONTAINER_UNORDEREDCONTAINER_H
#define CONTAINER_UNORDEREDCONTAINER_H
#include <iostream>
#include <string>
#include <unordered_map>
#include <vector>

/**
 * @brief 介绍无序关联容器，只介绍unorderemap 其他都与前面的容器差不多
 */
class UnorderedContainer
{
public:
    /**
     * @brief 介绍构造函数
     */
    static void Container()
    {
        std::unordered_map<int , std::string> nstrMap1{};
        std::unordered_map<int , std::string> nstrMap1(100); // 指定桶数量排序
        std::unordered_map<int , std::string> nstrMap3(100 , std::hash<int>()); // 指定桶数量和哈希函数
        std::unordered_map<int , std::string> nstrMap4{
            100 /*初始桶数量*/,
            std::hash<int>() /*哈希函数*/,
            std::equal_to<int>()/*键相等比较函数*/ ,
            std::allocator<std::pair<int , std::string>()> /*指定分配器*/
        }; // 完整构造函数

        std::vector<std::pair<int , std::string>> vec{{1 , "one"},{2 , "two"},{3 ,"three"}};
        std::unordered_map nstrMap5{vec.begin() , vec.end()}; // 范围构造函数
        std::unordered_map<int , std::string> nstrMap6{{1 , "one"},{2 , "two"},{3 ,"three"}}; // 初始化列表构造
        auto nstrMap7{nstrMap6}; // 拷贝构造函数，深拷贝
        auto nstrMap8{std::move(nstrMap7)}; // 移动拷贝构造函数
    }

    static void Capacity()
    {
        { // 负载因子是影响哈希性能表的关键参数
            std::unordered_map<int , std::string> nstrMap{10}; //
            nstrMap = {{1 , "one"},{2 , "two"},{3 ,"three"}};
            auto fCurLoad = nstrMap.load_factor(); // 获取当前装载因子
            std::cout << "The currrent load is: " << fCurLoad << std::endl; // 当前装载因子
            std::cout << "The max load factor is:" << nstrMap.max_load_factor() << std::endl; // 最大装载因子
            nstrMap.max_load_factor(0.75); // 重新设置装载因子
        }

        {
            std::unordered_map<int , std::string> nstrMap{}; //

            nstrMap.rehash(100); // 确保至少有1000个指定数量的桶
            nstrMap.reserve(500); // 预留500个元素的空间
        }
    }
    // 增删改查几乎都与前面的容器一致
};
#endif //CONTAINER_UNORDEREDCONTAINER_H